// https://leetcode.cn/problems/merge-two-sorted-lists/

// 题干：将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

// 示例：输入：l1 = [1,2,4], l2 = [1,3,4]
//       输出：[1,1,2,3,4,4]

// 碎语：函数头 函数体 最小子问题(函数出口)各是什么？
//       观察到，函数的作用是返回一个合并后的链表的头结点
//       参数是两个链表的头结点

#include <bits/stdc++.h>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};


class Solution
{
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
    {
        if (l1 == nullptr) return l2;
        if (l2 == nullptr) return l1;

        if (l1->val <= l2->val){
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        }
        else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};

int main()
{
    Solution sol;

    // 怎么初始化链表
    ListNode* l1 = new ListNode(1);
    l1->next = new ListNode(2);
    l1->next->next = new ListNode(4);

    ListNode* l2 = new ListNode(1);
    l2->next = new ListNode(3);
    l2->next->next = new ListNode(4);

    ListNode* index = sol.mergeTwoLists(l1, l2);
    while (index != nullptr){
        cout << index->val << " ";
        index = index->next;
    }
    cout << endl;

    delete l1;
    delete l2;

    return 0;
}